// Triangle.hpp

#ifndef RASTERIZER_TRIANGLE_H
#define RASTERIZER_TRIANGLE_H

#include <eigen3/Eigen/Eigen>
#include "Texture.hpp"

using namespace Eigen; 
//方便使用Eigen库中的类型和函数
class Triangle{

public:
    //由于是齐次坐标，所以是Vector4f,  (x,y,z,w)
    // 三角形的三个顶点，按照顺时针排列
    Vector4f v[3]; 

    // 三个顶点的颜色(r,g,b)
    Vector3f color[3];

    // 三个顶点的纹理坐标(u,v)
    Vector2f tex_coords[3];

    // 每个顶点的法向量
    Vector3f normal[3];

    //指向纹理对象的指针
    Texture *tex = nullptr;

    // 默认的构造函数
    Triangle();

    Eigen::Vector4f a() const { return v[0]; }
    Eigen::Vector4f b() const { return v[1]; }
    Eigen::Vector4f c() const { return v[2]; }

    // 设置index为ind的顶点的坐标
    void setVertex(int ind, Vector4f ver);
    // 设置index为ind的顶点的法向量
    void setNormal(int ind, Vector3f n);
    // 设置index为ind的顶点的颜色
    void setColor(int ind, float r, float g, float b);

    // 一次性设置所有三个顶点的法线向量
    void setNormals(const std::array<Vector3f, 3>& normal);
    // 一次性设置所有三个顶点的颜色
    void setColors(const std::array<Vector3f, 3>& colors);
    // 设置索引为ind的顶点的纹理坐标
    void setTexCoord(int ind, Vector2f uv);

    // 将三角形的三个顶点返回为std::array<Vector4f, 3>形式
    std::array<Vector4f, 3> toVector4() const;

};

#endif //RASTERIZER_TRIANGLE_H